﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Datos.InterfacesDAO;
using ConexiónBD;
using Modelo;
using Base_de_Datos.Excepciones;
using Datos.Excepciones;
namespace Datos
{
    public class DatosInformacion : IDAO_Informacion
    {
        string idUbicSent;

        //<summary>
        //Método que imprime la lista de Ubicación
        //</summary>
        public IList<Ubicacion> ListaUbicacion()
        {
            try
            {
                ConexionBD.Conectar();
                IList<Ubicacion> lista = new List<Ubicacion>();

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedure(Datos_Recursos.SPListaUbicacion);

                if (sql.HasRows.Equals(true))
                {
                    while (sql.Read())
                    {
                        Ubicacion ubicacionCamara = new Ubicacion();
                        ubicacionCamara.NombreUbicacion = sql[Datos_Recursos.ubicacionCamara].ToString();
                        ubicacionCamara.CodigoUbicacion = sql[Datos_Recursos.idUbicacion].ToString();
                        
                        lista.Add(ubicacionCamara);
                    }
                }
                return lista;
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionConsultar(Datos_Recursos.Consulta, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }

        //<summary>
        //Método que imprime la lista de UbicaciónTR
        //</summary>
        public IList<Ubicacion> ListaUbicacionTR()
        {
            try
            {
                ConexionBD.Conectar();
                IList<Ubicacion> lista = new List<Ubicacion>();

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedure(Datos_Recursos.SPListaUbicacionTR);
    
                  if (sql.HasRows.Equals(true))
                  {
                      while (sql.Read())
                      {
                          Ubicacion ubicacionCamaraTR = new Ubicacion();
                          ubicacionCamaraTR.NombreUbicacion = sql[Datos_Recursos.ubicacionCamara].ToString();
                          ubicacionCamaraTR.DNSCamara = sql[Datos_Recursos.DNS].ToString();
                          
                          lista.Add(ubicacionCamaraTR);

                      }
                }
                return lista;
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionConsultar(Datos_Recursos.Consulta, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }


        //<summary>
        //Método que imprime la lista Hora
        //</summary>
        public IList<Horario> ListaHoras()
        {
            try
            {
                ConexionBD.Conectar();
                IList<Horario> lista = new List<Horario>();

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedure(Datos_Recursos.SPListaHorario);

                if (sql.HasRows.Equals(true))
                {
                    while (sql.Read())
                    {
                        Horario hora = new Horario();
                        hora.CodigoHorario = sql[Datos_Recursos.idHora].ToString();
                        hora.Hora = sql[Datos_Recursos.hora].ToString();

                        lista.Add(hora);

                    }
                }
                return lista;
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionConsultar(Datos_Recursos.Consulta, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }

        //<summary>
        //Método que imprime la lista de Sentido
        //</summary>
        public IList<Sentido> ListaSentido(string ubicacion)
        {
            try
            {
                ConexionBD.Conectar();
                IList<Sentido> lista = new List<Sentido>();

                String[,] parametro = new String[2, 1];
                parametro[0, 0] = Datos_Recursos.IdentUbicacion;                         parametro[1, 0] = ubicacion;

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedureConParametros(Datos_Recursos.SPListaSentido, parametro, 1);

                if (sql.HasRows.Equals(true))
                {
                    while (sql.Read())
                    {
                        Sentido orientacionTrafico = new Sentido();
                        orientacionTrafico.CodigoSentido = sql[Datos_Recursos.idSentido].ToString();
                        orientacionTrafico.TipoSentido = sql[Datos_Recursos.tipoSentido].ToString();

                        lista.Add(orientacionTrafico);

                    }
                }
                return lista;
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionConsultar(Datos_Recursos.Consulta, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }

        //<summary>
        //Consulta el id del registro correspondiente a la ubicación y el sentido seleccionado
        //</summary>
        public string ConsultaUbicacionSentido(string ubicacion, string sentido)
        {
            try
            {
                ConexionBD.Conectar();

                String[,] parametro = new String[2, 2];

                parametro[0, 0] = Datos_Recursos.ConfiguracionUbicacion; parametro[1, 0] = ubicacion;
                parametro[0, 1] = Datos_Recursos.ConfiguracionSentido; parametro[1, 1] = sentido;

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedureConParametros(Datos_Recursos.SPConsultarUbicacionSentido, parametro, 2);

                if (sql.HasRows.Equals(true))
                {
                    while (sql.Read())
                    {
                        idUbicSent = sql[Datos_Recursos.idUbicacionSentido].ToString();
                    }
                }
                return idUbicSent;
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionConsultar(Datos_Recursos.Consulta, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }

        }

        //<summary>
        //Verifica si existe la Configuración de Reporte del  Usuario en la BD
        //</summary>
        public bool VerificaExistenciaConfiguracion(Reporte nuevoReporte, string idUsuario)
        {
            try
            {
                ConexionBD.Conectar();

                String[,] parametro = new String[2, 4];                                                
                parametro[0, 0] = Datos_Recursos.Login;                                                       parametro[1, 0] = idUsuario;
                parametro[0, 1] = Datos_Recursos.ConfiguracionUbicacion;                   parametro[1, 1] = nuevoReporte.UbicacionReporte;
                parametro[0, 2] = Datos_Recursos.ConfiguracionHorario;                        parametro[1, 2] = nuevoReporte.HorarioReporte;
                parametro[0,3] = Datos_Recursos.ConfiguracionSentido;                        parametro[1,3]= nuevoReporte.SentidoReporte;

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedureConParametros(Datos_Recursos.SPVerificaExistenciaConfiguracion, parametro, 4);

              // Si la configuracion ya está registrada
                if (sql.HasRows.Equals(true))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionConsultar(Datos_Recursos.Consulta, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }      

        //<summary>
        //Inserta una nueva Configuración de Reporte del  Usuario en la BD
        //</summary>
        public bool InsertaConfiguracion(Reporte nuevoReporte, string login)
        {
            try
            {
                string ubicacionSentido = ConsultaUbicacionSentido(nuevoReporte.UbicacionReporte, 
                                                                                                                        nuevoReporte.SentidoReporte);

                ConexionBD.Conectar();

                String[,] parametro = new String[2, 3];

                parametro[0, 0] = Datos_Recursos.Login;                                          parametro[1,0] = login;
                parametro[0, 1] = Datos_Recursos.UbicacionSentido;                   parametro[1, 1] = ubicacionSentido;
                parametro[0,2] = Datos_Recursos.ConfiguracionHorario;            parametro[1,2] = nuevoReporte.HorarioReporte;

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedureConParametros(Datos_Recursos.SPRegistrarConfiguracion, parametro, 3);

                return true;
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionRegistrar(Datos_Recursos.Registro, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }

        //<summary>
        //Elimina una Configuración de Reporte del  Usuario en la BD
        //</summary>
        public bool EliminaConfiguracion(string idConfig, string login)
        {
            try
            {
                ConexionBD.Conectar();

                String[,] parametro = new String[2, 2];

                parametro[0, 0] = Datos_Recursos.ConfigId;  parametro[1, 0] = idConfig;
                parametro[0, 1] = Datos_Recursos.UsuarioId; parametro[1, 1] = login;
         

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedureConParametros(Datos_Recursos.SPEliminarConfiguracionReporte, parametro, 2);

                return true;
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionRegistrar(Datos_Recursos.Registro, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }

        //<summary>
        //Consulta la imagen del reporte de tráfico en la BD
        //</summary>
        public string ConsultaImagenReporte(string ubicacion, string sentido)
        {
            try
            {
                ConexionBD.Conectar();

                String[,] parametro = new String[2, 2];

                parametro[0, 0] = Datos_Recursos.ConfiguracionUbicacion; parametro[1, 0] = ubicacion;
                parametro[0, 1] = Datos_Recursos.ConfiguracionSentido; parametro[1, 1] = sentido;


                SqlDataReader sql = ConexionBD.EjecutarStoreProcedureConParametros(Datos_Recursos.SPConsultaImagenReporte, parametro, 2);

                Reporte srcImagen = new Reporte();

                if (sql.HasRows.Equals(true))
                {
                    while (sql.Read())
                    {
                        srcImagen.ImagenReporte = sql[Datos_Recursos.imagen].ToString();
                    }
                    return srcImagen.ImagenReporte;
                }
                else
                {
                    srcImagen.ImagenReporte = Datos_Recursos.blanco;
                    return srcImagen.ImagenReporte;
                }
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionRegistrar(Datos_Recursos.Registro, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        } 
    }
}